const path = require('path');
const fs = require('fs');
const express = require('express');

const shortid = require('shortid');

const state = require('../state.js');
console.log( state.login );

const router = express.Router();

// 确定存放课程信息的目录
const courseDir = path.resolve( 'files' , 'course' );
const suffix = '.txt' ; // 确定文件名后缀

let checkLogin = (req,resp,next) => {
    if( state.login ) {
        next();
        return ;
    }
    // 返回到教师登录页面
    resp.render( 'teacher/login' , { message: '请先登录' } );
}

router.all( '/add' , checkLogin );

// 路由: 带我们去添加课程的页面
router.get( '/add' , (req,resp)=>{
    // 渲染模版文件 ( /views/course/add.njk )
    resp.render( 'course/add' );
});

// 路由: 接受表单数据并将其保存到文件中
router.post( '/add' , (req,resp)=>{
    // 从 请求体(req.body) 中可以获取POST表单提交的数据
    let courseNo = req.body.number ;
    let courseName = req.body.name ;
    let courseHours = req.body.hours ;
    let courseCredit = req.body.credit ;

    // 数据校验
    if( !courseName ){
        resp.render( 'course/add' , {message: '课程名不可为空' } );
        return ;
    }

    let course = {
        // 通过 shortid 提供的支持来创建 id
        id: shortid.generate() ,
        number: courseNo ,
        name: courseName ,
        hours: courseHours ,
        credit: courseCredit
    }

    // 将一个对象(实例)转换为 JSON 格式的字符串
    let s = JSON.stringify( course );

    let filename = course.id + suffix ;
    let filepath = path.resolve( courseDir , filename );

    // 保存课程信息到文件中
    fs.writeFileSync( filepath , s );

    // 保存成功后去往列表页面(重定向到 `/course/list` )
    resp.redirect( '/course/list' );
});

// 路由: 带我们去课程列表的页面
router.get( '/list' , (req,resp)=>{

    let arr = [] ; // 声明数组用以存放课程信息

    // 先读取存放课程文件的目录，获取所有课程文件的名称
    let filenames = fs.readdirSync( courseDir );

    // 使用 forEach 遍历数组
    filenames.forEach( (element,index,array) => {
        // 此时的 element 就是 filesnames 数组中其中一个文件名
        let filepath = path.resolve( courseDir , element );
        // 使用 fs 模块提供的支持 同步读取文件内容
        let content = fs.readFileSync( filepath , 'utf8');
        // 将 JSON 格式的字符串 解析为 JavaScript 对象(实例)
        let instance = JSON.parse( content );
        // 将课程信息添加到数组中
        arr.push( instance );
    });

    // 渲染模版文件 ( /views/course/list.njk )
    resp.render( 'course/list' , { courses: arr , login: state.login } );
});

router.all( '/remove/:id' , checkLogin );

// 路由: 带我们去添加课程的页面
router.get( '/remove/:id' , (req,resp)=>{
    // 通过 req.params 可以获得路由参数
    let id = req.params.id ;

    let filename = id + suffix ;
    let filepath = path.resolve( courseDir , filename );

    fs.rmSync( filepath );

    resp.redirect( '/course/list' );
});

router.all( '/edit/:id' , checkLogin );

// 路由: 带我们去编辑页面(并在编辑页面显示原来的数据)
router.get( '/edit/:id' , (req,resp)=>{
    // 通过 req.params 可以获得路由参数
    let id = req.params.id ;

    let filename = id + suffix ;
    let filepath = path.resolve( courseDir , filename );

    // 读取文件内容
    let content = fs.readFileSync( filepath , 'utf8');
    // 将 JSON格式的字符串解析为JavaScript对象(实例)
    let c = JSON.parse( content );

    resp.render( 'course/edit' , { course: c } );
});

router.all( '/edit' , checkLogin );

// 路由: 接受来自表单的数据并更新文件中内容
router.post( '/edit' , (req,resp)=>{
    // 通过 req.body 可以获得路由参数
    let courseId = req.body.id ;
    let courseNo = req.body.number ;
    let courseName = req.body.name ;
    let courseHours = req.body.hours ;
    let courseCredit = req.body.credit ;

    // 数据校验(参照添加课程来完成)

    let filename = courseId + suffix ;
    let filepath = path.resolve( courseDir , filename );

    // 首先删除原来的文件
    fs.rmSync( filepath );

    let course = {
        id: courseId ,
        number: courseNo ,
        name: courseName ,
        hours: courseHours ,
        credit: courseCredit
    }

    // 将一个对象(实例)转换为 JSON 格式的字符串
    let s = JSON.stringify( course );

    fs.writeFileSync( filepath , s , 'utf8');

    resp.redirect( '/course/list' );
});

module.exports = router ;